package com.jingdianjichi.subject.infra.utils;

import com.alibaba.druid.filter.config.ConfigTools;

import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;

public class DruidEncryptUtil {
    //设置两个钥匙：
    //公钥：
    private static String publicKey;
    //私钥
    private static String privateKey;

    //静态代码块
    static{
        try {
            /**
             * 参数：指定生成密钥对时的密钥长度，通常是 1024、2048 或 4096 位，直接影响密钥的安全性、性能和存储需求。
             *      下面是生成一个2048位的密钥对
             * 返回值：返回的数组包含两个元素，第一个是 Base64 编码的私钥，第二个是 Base64 编码的公钥
             * Base64编码：生成的密钥会被编码为 Base64 格式，这是因为密钥通常是二进制数据，而Base64编码可以使它们以 ASCII 字符串的形式表示，方便存储和传输
             */
            String[] keyPair = ConfigTools.genKeyPair(2048);
            privateKey = keyPair[0]; //获取私钥
            System.out.println("privateKey:"+privateKey);
            publicKey = keyPair[1];  //获取公钥
            System.out.println("publicKe:"+publicKey);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        } catch (NoSuchProviderException e) {
            throw new RuntimeException(e);
        }
    }

    //设置两个方法分别进行加密解密：
    //加密：
    public static String encrypt(String plainText) throws Exception {
        /**
         * 参数：
         *      privateKey：表示要使用私钥进行加密
         *      plainText： 表示需要加密的明文数据
         * 返回值： 密文
         */
        String encrypt = ConfigTools.encrypt(privateKey,plainText);
        System.out.println("encrypt:" + encrypt);
        return encrypt;
    }

    //解密
    public static String decrypt(String encryptText) throws Exception {
        /**
         * 参数：
         *      privateKey：表示要使用私钥进行加密
         *      encryptText： 表示要解密的密文数据
         * 返回值： 解密后的明文数据
         */
        String decrypt = ConfigTools.decrypt(publicKey, encryptText);
        System.out.println("decrypt:" + decrypt);
        return decrypt;
    }

    //
    public static void main(String[] args) throws Exception {
        String encrypt = encrypt("123456");
        System.out.println("encrypt:" + encrypt);
        
    }



}
